package com.supcalls;

import java.util.Optional;

public class OptionalDemo {

    public static void main(String[] args) {
        // 创建一个空的 Optional
        Optional<String> emptyOptional = Optional.empty();
        System.out.println("Empty Optional: " + emptyOptional);

        // 创建一个非空的 Optional
        Optional<String> nonEmptyOptional = Optional.of("Hello, Optional!");
        System.out.println("Non-empty Optional: " + nonEmptyOptional.get());

        // 使用 ofNullable 创建一个可为空的 Optional
        String value = null;
        Optional<String> nullableOptional = Optional.ofNullable(value);
        System.out.println("Nullable Optional (null value): " + nullableOptional);

        // 使用 ifPresent 对非空值执行操作
        nonEmptyOptional.ifPresent(val -> System.out.println("Value is present: " + val));

        // 使用 orElse 提供默认值
        String result = nullableOptional.orElse("Default Value");
        System.out.println("Result using orElse: " + result);

        // 使用 orElseGet 提供默认值，通过 Supplier 提供默认值
        result = nullableOptional.orElseGet(() -> "Generated Default Value");
        System.out.println("Result using orElseGet: " + result);

        // 使用 map 对 Optional 中的值进行转换
        Optional<String> upperCaseOptional = nonEmptyOptional.map(String::toUpperCase);
        System.out.println("Mapped Optional (upper case): " + upperCaseOptional.get());

        // 使用 flatMap 可以避免多层嵌套的 Optional
        Optional<String> resultFromFlatMap = nonEmptyOptional.flatMap(val -> Optional.of("Mapped: " + val));
        System.out.println("FlatMap result: " + resultFromFlatMap.get());

        // 使用 filter 根据条件筛选
        Optional<String> filteredOptional = nonEmptyOptional.filter(val -> val.contains("Optional"));
        System.out.println("Filtered Optional: " + filteredOptional);

        // 使用 orElseThrow 处理为空时抛出异常
        try {
            String throwException = emptyOptional.orElseThrow(() -> new IllegalArgumentException("Value is missing"));
        } catch (IllegalArgumentException e) {
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}

